📘 Clase 02: Pilas (Stacks) y Colas (Queues) con collections.deque
- :material-bookmark: Curso: Curso 2: Algoritmos Avanzados y Estructuras de Datos (CLASE 02)
- :material-signal-cellular-outline: Nivel:
Nivel 2 - Intermedio - :material-lightbulb-on: Metáfora Central: «La Pila de Platos (LIFO) y la Fila del Banco (FIFO)»
- :material-laptop: Wisrovi Studio (Local): 🚀 Abrir Reto • 👨🏫 Modo Tutor
- :material-file-pdf-box: Manual PDF Oficial: Descargar clase-02-pilas-y-colas.pdf
1. 💡 Fundamentación Teórica y Modelo Mental
Estructuras fundamentales de control secuencial:
1. Pila (Stack - LIFO): Last-In, First-Out. Usada para llamadas a funciones, parseo de paréntesis y backtracking.
2. Cola (Queue - FIFO): First-In, First-Out. Usada para procesamiento de tareas en segundo plano y BFS.
3. collections.deque: Estructura de doble extremo con inserción/extracción $O(1)$ en ambos lados.
🌟 Modelo Mental de la Sesión: «La Pila de Platos (LIFO) y la Fila del Banco (FIFO)»
En esta sesión anclamos el aprendizaje en la metáfora del mundo real para visualizar cómo fluyen las estructuras de datos y el flujo de ejecución en la memoria.
2. 🗺️ Arquitectura de Ejecución y Diagrama de Flujo
flowchart LR
subgraph Pila["🥞 Pila (LIFO)"]
P1["push('(')"] --> P2["push('[')"] --> P3["pop() -> ']' matched"]
end
subgraph Cola["🚶 Cola (FIFO)"]
Q1["append(cliente_1)"] --> Q2["append(cliente_2)"] --> Q3["popleft() -> cliente_1"]
end
style Pila fill:#1e293b,color:#ffffff,stroke:#3b82f6,stroke-width:2px
style Cola fill:#0f766e,color:#ffffff,stroke:#2dd4bf,stroke-width:2px
3. 💻 Código de Implementación Práctica
```python from collections import deque
cola = deque(["Tarea 1", "Tarea 2", "Tarea 3"]) cola.append("Tarea 4") atendida = cola.popleft() print(f"Atendida: {atendida} | En cola:", list(cola)) ```
```python pila = []
pila.append("Página 1") pila.append("Página 2") print("Atrás a:", pila.pop()) ```
4. 🛡️ Buenas Prácticas PEP 8: Antipatrones vs Código Pythonic
⚠️ Cuidado con los Antipatrones
```python cola = []
cola.append(x) primero = cola.pop(0) # ❌ O(n) movimiento de bloques en memoria ```
```python from collections import deque
cola = deque() cola.append(x) primero = cola.popleft() # ✅ O(1) instantáneo ```
5. 🏋️ Desafío Práctico de la Clase
🎯 Enunciado del Reto
Crea una función validar_parentesis(cadena: str) -> bool que use una pila (list) para verificar si los símbolos '()', '[]' y '{}' están correctamente balanceados y anidados.
⚡ Resolución Híbrida en 1 Clic (Local + Web)
Si tienes ejecutando wisrovi ui en tu terminal local, puedes 🚀 Abrir este Reto directamente en tu Studio Local (127.0.0.1:8501) para escribir tu código con auto-formateo AST, inspeccionar variables en el Heap/Stack y evaluarlo con pruebas en tiempo real.
def validar_parentesis(cadena: str) -> bool:
# ✍️ Usa una pila para validar balance de () [] {}
pila = []
pares = {')': '(', ']': '[', '}': '{'}
for char in cadena:
if char in pares.values():
pila.append(char)
elif char in pares:
if not pila or pila.pop() != pares[char]:
return False
return len(pila) == 0
💡 Pista Socrática 1
💡 Pista 1: Empuja los caracteres de apertura (, [, { a la pila.
💡 Pista Socrática 2
💡 Pista 2: Al encontrar uno de cierre, comprueba si coincide con el pop() de la pila.
💡 Pista Socrática 3
💡 Pista 3: Retorna True únicamente si al final la pila queda vacía (len(pila) == 0).
Para resolver este ejercicio en tu entorno:
1. Abre el archivo ejercicios/reto.py de esta clase en Visual Studio Code o utiliza wisrovi ui / wisrovi tutor.
2. Implementa tu solución cumpliendo los requisitos y contratos de tipado.
3. Valida tus resultados ejecutando las pruebas unitarias: